package top.lishuoboy.springmvc.a11;

import cn.hutool.core.exceptions.ExceptionUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * 十一、异常处理器——基于注解
 *
 * @author lishuoboy
 */
@Slf4j
//@ControllerAdvice将当前类标识为异常处理的组件
@ControllerAdvice
public class AnotationExceptionHandler {

    /**
     * 2、基于注解的异常处理【推荐】
     * //@ControllerAdvice将当前类标识为异常处理的组件
     * //@ExceptionHandler用于设置所标识方法处理的异常 @ExceptionHandler(ArithmeticException.class)
     * //ex表示当前请求处理中出现的异常对象
     */
    @ExceptionHandler(NullPointerException.class)
    private String excection2(Exception ex, Model model) {
        {
            log.warn("异常了", ex);

            model.addAttribute("ex", ex);
            model.addAttribute("ex2", ExceptionUtil.stacktraceToString(ex, Integer.MAX_VALUE));
            return "a11/exception";
        }
    }


    /**
     * 3、默认情况下，web项目（包括原生web和springMVC）在运行时异常时，直接将打印在前端页面，后台没有打印输出到控制台（catalina.2021-10-15.log），只输出到了“localhost.2021-10-15.log”文件中，
     * 所以增加一个异常处理器，将所有Exception日志输出打印到控制台（catalina.2021-10-15.log）
     * http://localhost:8080/lishuoboy_springmvc_war_exploded/a11/3
     */
    @ExceptionHandler(Exception.class)
    private void excectionAll(Exception ex) throws Throwable {
        {
            // 打印异常日志到控制台
            log.error("异常了呦", ex);
            // 还把异常抛给tomcat，输出到页面
            throw ex;
        }
    }
}